package cn.bearspark.article.provider.service;

import cn.bearspark.article.dto.category.*;

import java.util.List;

/**
 * 专栏分类的服务接口
 *
 * @author f
 */
public interface CategoryService {

    /**
     * 添加专栏分类
     * <p>
     * 个人专栏分类最多 100 个，如果超过 100 个，则不会添加
     *
     * @param addCategoryDTO 添加专栏分类的数据传输对象
     */
    void add(AddCategoryDTO addCategoryDTO);

    /**
     * 获取专栏分类信息
     *
     * @param userId     获取专栏分类信息的用户 id
     * @param categoryId 待获取信息的专栏分类 id
     * @return 专栏分类信息，如果该专栏分类不属于该用户，则返回 null
     */
    CategoryDTO get(long userId, long categoryId);

    /**
     * 修改专栏分类
     * <p>
     * 如果该专栏不属于该用户，则不做任何操作
     *
     * @param modifyCategoryDTO 修改专栏分类的数据传输对象
     */
    void modify(ModifyCategoryDTO modifyCategoryDTO);

    /**
     * 删除专栏分类
     * <p>
     * 如果该专栏不属于该用户，则不做任何操作
     *
     * @param userId     删除专栏分类的用户 id
     * @param categoryId 待删除的专栏分类 id
     */
    void delete(long userId, long categoryId);

    /**
     * 获取指定用户的专栏分类简要信息
     * <p>
     * 按照分类专栏数量进行排序
     *
     * @param userId       获取专栏分类简要信息的用户 id
     * @param listedUserId 待获取专栏分类简要信息集合的用户 id
     * @return 专栏分类简要信息的集合
     */
    List<CategorySimpleDTO> listByListedUserId(long userId, long listedUserId);

    /**
     * 增加指定分类的 全部专栏数 和 公开专栏数
     * <p>
     * 如果没有指定的分类，则不做任何操作，并返回 false
     *
     * @param userId         发布专栏的用户 id
     * @param visibility     专栏的可见性
     * @param categoryIdList 专栏的分类 id 集合
     * @return 如果没有指定分类，则返回 false；否则返回 true
     */
    boolean incrArticleNum(long userId, int visibility, List<Long> categoryIdList);

    /**
     * 修改指定分类的 全部专栏数 和 公开专栏数
     * <p>
     * 如果没有指定的分类，则不做任何操作，并返回 false
     *
     * @param userId            发布专栏的用户 id
     * @param oldVisibility     旧可见性
     * @param newVisibility     新可见性
     * @param oldCategoryIdList 旧分类的 id 集合
     * @param newCategoryIdList 新分类的 id 集合
     * @return 如果没有指定的新分类，则返回 false；否则返回 true
     */
    boolean updateArticleNum(long userId, int oldVisibility, int newVisibility,
                             List<Long> oldCategoryIdList, List<Long> newCategoryIdList);

    /**
     * 减少指定分类的 全部专栏数 和 公开专栏数
     *
     * @param userId         拥有分类的用户 id
     * @param visibility     专栏的可见性
     * @param categoryIdList 专栏的分类 id 集合
     */
    void decrArticleNum(long userId, int visibility, List<Long> categoryIdList);

    /**
     * 获取指定专栏分类的最简信息
     *
     * @param categoryIdList 待获取专栏分类最简信息的分类 id 集合
     * @return 指定专栏分类最简信息的集合
     */
    List<CategorySlimDTO> listSlimByCategoryId(List<Long> categoryIdList);

    /**
     * 获取指定专栏分类的简要信息
     *
     * @param categoryIdList 待获取专栏分类简要信息的分类 id 集合
     * @return 指定专栏分类简要信息的集合
     */
    List<CategorySimpleDTO> listSimpleByCategoryId(List<Long> categoryIdList);
}
